<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title></title>
</head>
<body>
	<script type="text/javascript">
		/*alert(a)
	    a()
	    var a = 3;
	    function a(argument) {
	      alert(10)
	    }
	    alert(a)
	    a = 6;
	    a()*/
	    /*
	      a function
	      10
	      3
	      a is not a function
	      lhs = rhs
	      lhs rhs 左右引用
	      1、变量提升 替身到当前函数作用域顶端
	      2、变量提升时，变量名与函数名相同时，变量在没有被赋值之前会被忽略，也就是说打印出来的结果是函数
	      3、只有const 和 let 声明的变量才是块级作用域，var声明的变量也是会有变量提升
	    */
	    // console.log(b)
	    /*{
	    	var a = 9;
	    	const num = 666;
	    }
	    console.log(a)
	    console.log(num)*/
	    /*{
	    	function yideng(){}
	    	yideng = 666;
	    	console.log('内部重写函数🍌', yideng)
	    }
	    console.log('外部访问函数值🍎', yideng)*/
	    /*
			只有块级作用域内部才能给函数赋值和重写函数
			外部只能获取函数的最初值，无法重写
	    */

	    function init(){
	    	console.log('outter')
	    }
	    /*if(false){
	    	function init(){
	    		console.log('inner')
	    	}
	    }
	    init();*/
	    /*
			里面的函数也是会声明提前，但是只是将函数名提前； 就是 var init;是带不走函数体的，所以，执行方法，打印 outter
	    */

	    function yideng(){
	    	if(false){
	    		function init(){
	    			console.log('inner')
	    		}
	    	}
	    	init() // 这里的函数提升到 yideng 函数的作用域顶部，执行时所以会报错 init is not a function
	    }
	    // yideng()
	    /*(function(){
	    	debugger;
	    })();*/

	    var x = 1, y = 0, z = 0;
	    function add(x) {
	    	return (x = x + 1)
	    }
	    y = add(x);
	    console.log(y);
	    function add(x){
	    	return (x = x + 3)
	    }
	    z = add(x);
	    console.log(z)
	    /*
	    	函数没有重载，命名一样的函数，后边的函数会覆盖之前名称相同的函数
			所以，最上边的 add函数x=x+1 是无用的
			所以，最后计算的方式是 x = x + 3
			5
	    */
	</script>
</body>
</html>